{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Huge Monty Hall Bayesian Network"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "authors:<br>\n",
    "Jacob Schreiber [<a href=\"mailto:jmschreiber91@gmail.com\">jmschreiber91@gmail.com</a>]<br>\n",
    "Nicholas Farn [<a href=\"mailto:nicholasfarn@gmail.com\">nicholasfarn@gmail.com</a>]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets expand the Bayesian network for the monty hall problem in order to make sure that training with all types of wild types works properly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "from pomegranate import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We'll create the discrete distribution for our friend first."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "friend = DiscreteDistribution( { True: 0.5, False: 0.5 } )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The emissions for our guest are completely random."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "guest = ConditionalProbabilityTable(\n",
    "\t[[ True, 'A', 0.50 ],\n",
    "\t [ True, 'B', 0.25 ],\n",
    "\t [ True, 'C', 0.25 ],\n",
    "\t [ False, 'A', 0.0 ],\n",
    "\t [ False, 'B', 0.7 ],\n",
    "\t [ False, 'C', 0.3 ]], [friend] )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then the distribution for the remaining cars."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "remaining = DiscreteDistribution( { 0: 0.1, 1: 0.7, 2: 0.2, } )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The probability of whether the prize is randomized is dependent on the number of remaining cars."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "randomize = ConditionalProbabilityTable(\n",
    "\t[[ 0, True , 0.05 ],\n",
    "     [ 0, False, 0.95 ],\n",
    "     [ 1, True , 0.8 ],\n",
    "     [ 1, False, 0.2 ],\n",
    "     [ 2, True , 0.5 ],\n",
    "     [ 2, False, 0.5 ]], [remaining] )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now the conditional probability table for the prize. This is dependent on the guest's friend and whether or not it is randomized."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "prize = ConditionalProbabilityTable(\n",
    "\t[[ True, True, 'A', 0.3 ],\n",
    "\t [ True, True, 'B', 0.4 ],\n",
    "\t [ True, True, 'C', 0.3 ],\n",
    "\t [ True, False, 'A', 0.2 ],\n",
    "\t [ True, False, 'B', 0.4 ],\n",
    "\t [ True, False, 'C', 0.4 ],\n",
    "\t [ False, True, 'A', 0.1 ],\n",
    "\t [ False, True, 'B', 0.9 ],\n",
    "\t [ False, True, 'C', 0.0 ],\n",
    "\t [ False, False, 'A', 0.0 ],\n",
    "\t [ False, False, 'B', 0.4 ],\n",
    "\t [ False, False, 'C', 0.6]], [randomize, friend] )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally we can create the conditional probability table for our Monty. This is dependent on the guest and the prize."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "monty = ConditionalProbabilityTable(\n",
    "\t[[ 'A', 'A', 'A', 0.0 ],\n",
    "\t [ 'A', 'A', 'B', 0.5 ],\n",
    "\t [ 'A', 'A', 'C', 0.5 ],\n",
    "\t [ 'A', 'B', 'A', 0.0 ],\n",
    "\t [ 'A', 'B', 'B', 0.0 ],\n",
    "\t [ 'A', 'B', 'C', 1.0 ],\n",
    "\t [ 'A', 'C', 'A', 0.0 ],\n",
    "\t [ 'A', 'C', 'B', 1.0 ],\n",
    "\t [ 'A', 'C', 'C', 0.0 ],\n",
    "\t [ 'B', 'A', 'A', 0.0 ],\n",
    "\t [ 'B', 'A', 'B', 0.0 ],\n",
    "\t [ 'B', 'A', 'C', 1.0 ],\n",
    "\t [ 'B', 'B', 'A', 0.5 ],\n",
    "\t [ 'B', 'B', 'B', 0.0 ],\n",
    "\t [ 'B', 'B', 'C', 0.5 ],\n",
    "\t [ 'B', 'C', 'A', 1.0 ],\n",
    "\t [ 'B', 'C', 'B', 0.0 ],\n",
    "\t [ 'B', 'C', 'C', 0.0 ],\n",
    "\t [ 'C', 'A', 'A', 0.0 ],\n",
    "\t [ 'C', 'A', 'B', 1.0 ],\n",
    "\t [ 'C', 'A', 'C', 0.0 ],\n",
    "\t [ 'C', 'B', 'A', 1.0 ],\n",
    "\t [ 'C', 'B', 'B', 0.0 ],\n",
    "\t [ 'C', 'B', 'C', 0.0 ],\n",
    "\t [ 'C', 'C', 'A', 0.5 ],\n",
    "\t [ 'C', 'C', 'B', 0.5 ],\n",
    "\t [ 'C', 'C', 'C', 0.0 ]], [guest, prize] )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can create the states for our bayesian network."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "s0 = State( friend, name=\"friend\")\n",
    "s1 = State( guest, name=\"guest\" )\n",
    "s2 = State( prize, name=\"prize\" )\n",
    "s3 = State( monty, name=\"monty\" )\n",
    "s4 = State( remaining, name=\"remaining\" )\n",
    "s5 = State( randomize, name=\"randomize\" )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we'll create our bayesian network with an instance of BayesianNetwork, then add the possible states."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "network = BayesianNetwork( \"test\" )\n",
    "network.add_states(s0, s1, s2, s3, s4, s5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then the possible transitions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "network.add_transition( s0, s1 )\n",
    "network.add_transition( s1, s3 )\n",
    "network.add_transition( s2, s3 )\n",
    "network.add_transition( s4, s5 )\n",
    "network.add_transition( s5, s2 )\n",
    "network.add_transition( s0, s2 )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "With a \"bake\" to finalize the structure of our network."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "network.bake()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's create our network from the following data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{\n",
       "    \"class\" : \"BayesianNetwork\",\n",
       "    \"name\" : \"test\",\n",
       "    \"structure\" : [\n",
       "        [],\n",
       "        [\n",
       "            0\n",
       "        ],\n",
       "        [\n",
       "            5,\n",
       "            0\n",
       "        ],\n",
       "        [\n",
       "            1,\n",
       "            2\n",
       "        ],\n",
       "        [],\n",
       "        [\n",
       "            4\n",
       "        ]\n",
       "    ],\n",
       "    \"states\" : [\n",
       "        {\n",
       "            \"class\" : \"State\",\n",
       "            \"distribution\" : {\n",
       "                \"class\" : \"Distribution\",\n",
       "                \"dtype\" : \"bool\",\n",
       "                \"name\" : \"DiscreteDistribution\",\n",
       "                \"parameters\" : [\n",
       "                    {\n",
       "                        \"True\" : 0.5833333333333334,\n",
       "                        \"False\" : 0.4166666666666667\n",
       "                    }\n",
       "                ],\n",
       "                \"frozen\" : false\n",
       "            },\n",
       "            \"name\" : \"friend\",\n",
       "            \"weight\" : 1.0\n",
       "        },\n",
       "        {\n",
       "            \"class\" : \"State\",\n",
       "            \"distribution\" : {\n",
       "                \"class\" : \"Distribution\",\n",
       "                \"name\" : \"ConditionalProbabilityTable\",\n",
       "                \"table\" : [\n",
       "                    [\n",
       "                        \"True\",\n",
       "                        \"A\",\n",
       "                        \"0.2857142857142857\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"True\",\n",
       "                        \"B\",\n",
       "                        \"0.0\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"True\",\n",
       "                        \"C\",\n",
       "                        \"0.7142857142857143\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"False\",\n",
       "                        \"A\",\n",
       "                        \"0.6\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"False\",\n",
       "                        \"B\",\n",
       "                        \"0.4\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"False\",\n",
       "                        \"C\",\n",
       "                        \"0.0\"\n",
       "                    ]\n",
       "                ],\n",
       "                \"dtypes\" : [\n",
       "                    \"bool\",\n",
       "                    \"str\",\n",
       "                    \"float\"\n",
       "                ],\n",
       "                \"parents\" : [\n",
       "                    {\n",
       "                        \"class\" : \"Distribution\",\n",
       "                        \"dtype\" : \"bool\",\n",
       "                        \"name\" : \"DiscreteDistribution\",\n",
       "                        \"parameters\" : [\n",
       "                            {\n",
       "                                \"True\" : 0.5833333333333334,\n",
       "                                \"False\" : 0.4166666666666667\n",
       "                            }\n",
       "                        ],\n",
       "                        \"frozen\" : false\n",
       "                    }\n",
       "                ]\n",
       "            },\n",
       "            \"name\" : \"guest\",\n",
       "            \"weight\" : 1.0\n",
       "        },\n",
       "        {\n",
       "            \"class\" : \"State\",\n",
       "            \"distribution\" : {\n",
       "                \"class\" : \"Distribution\",\n",
       "                \"name\" : \"ConditionalProbabilityTable\",\n",
       "                \"table\" : [\n",
       "                    [\n",
       "                        \"True\",\n",
       "                        \"True\",\n",
       "                        \"A\",\n",
       "                        \"0.5\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"True\",\n",
       "                        \"True\",\n",
       "                        \"B\",\n",
       "                        \"0.0\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"True\",\n",
       "                        \"True\",\n",
       "                        \"C\",\n",
       "                        \"0.5\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"True\",\n",
       "                        \"False\",\n",
       "                        \"A\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"True\",\n",
       "                        \"False\",\n",
       "                        \"B\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"True\",\n",
       "                        \"False\",\n",
       "                        \"C\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"False\",\n",
       "                        \"True\",\n",
       "                        \"A\",\n",
       "                        \"0.0\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"False\",\n",
       "                        \"True\",\n",
       "                        \"B\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"False\",\n",
       "                        \"True\",\n",
       "                        \"C\",\n",
       "                        \"0.6666666666666666\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"False\",\n",
       "                        \"False\",\n",
       "                        \"A\",\n",
       "                        \"0.6\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"False\",\n",
       "                        \"False\",\n",
       "                        \"B\",\n",
       "                        \"0.4\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"False\",\n",
       "                        \"False\",\n",
       "                        \"C\",\n",
       "                        \"0.0\"\n",
       "                    ]\n",
       "                ],\n",
       "                \"dtypes\" : [\n",
       "                    \"bool\",\n",
       "                    \"bool\",\n",
       "                    \"str\",\n",
       "                    \"float\"\n",
       "                ],\n",
       "                \"parents\" : [\n",
       "                    {\n",
       "                        \"class\" : \"Distribution\",\n",
       "                        \"name\" : \"ConditionalProbabilityTable\",\n",
       "                        \"table\" : [\n",
       "                            [\n",
       "                                \"0\",\n",
       "                                \"False\",\n",
       "                                \"0.6666666666666666\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"0\",\n",
       "                                \"True\",\n",
       "                                \"0.3333333333333333\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"1\",\n",
       "                                \"False\",\n",
       "                                \"0.8\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"1\",\n",
       "                                \"True\",\n",
       "                                \"0.2\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"2\",\n",
       "                                \"False\",\n",
       "                                \"0.5\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"2\",\n",
       "                                \"True\",\n",
       "                                \"0.5\"\n",
       "                            ]\n",
       "                        ],\n",
       "                        \"dtypes\" : [\n",
       "                            \"int\",\n",
       "                            \"bool\",\n",
       "                            \"float\"\n",
       "                        ],\n",
       "                        \"parents\" : [\n",
       "                            {\n",
       "                                \"class\" : \"Distribution\",\n",
       "                                \"dtype\" : \"int\",\n",
       "                                \"name\" : \"DiscreteDistribution\",\n",
       "                                \"parameters\" : [\n",
       "                                    {\n",
       "                                        \"0\" : 0.25,\n",
       "                                        \"1\" : 0.4166666666666667,\n",
       "                                        \"2\" : 0.3333333333333333\n",
       "                                    }\n",
       "                                ],\n",
       "                                \"frozen\" : false\n",
       "                            }\n",
       "                        ]\n",
       "                    },\n",
       "                    {\n",
       "                        \"class\" : \"Distribution\",\n",
       "                        \"dtype\" : \"bool\",\n",
       "                        \"name\" : \"DiscreteDistribution\",\n",
       "                        \"parameters\" : [\n",
       "                            {\n",
       "                                \"True\" : 0.5833333333333334,\n",
       "                                \"False\" : 0.4166666666666667\n",
       "                            }\n",
       "                        ],\n",
       "                        \"frozen\" : false\n",
       "                    }\n",
       "                ]\n",
       "            },\n",
       "            \"name\" : \"prize\",\n",
       "            \"weight\" : 1.0\n",
       "        },\n",
       "        {\n",
       "            \"class\" : \"State\",\n",
       "            \"distribution\" : {\n",
       "                \"class\" : \"Distribution\",\n",
       "                \"name\" : \"ConditionalProbabilityTable\",\n",
       "                \"table\" : [\n",
       "                    [\n",
       "                        \"A\",\n",
       "                        \"A\",\n",
       "                        \"A\",\n",
       "                        \"0.2\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"A\",\n",
       "                        \"A\",\n",
       "                        \"B\",\n",
       "                        \"0.2\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"A\",\n",
       "                        \"A\",\n",
       "                        \"C\",\n",
       "                        \"0.6\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"A\",\n",
       "                        \"B\",\n",
       "                        \"A\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"A\",\n",
       "                        \"B\",\n",
       "                        \"B\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"A\",\n",
       "                        \"B\",\n",
       "                        \"C\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"A\",\n",
       "                        \"C\",\n",
       "                        \"A\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"A\",\n",
       "                        \"C\",\n",
       "                        \"B\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"A\",\n",
       "                        \"C\",\n",
       "                        \"C\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"B\",\n",
       "                        \"A\",\n",
       "                        \"A\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"B\",\n",
       "                        \"A\",\n",
       "                        \"B\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"B\",\n",
       "                        \"A\",\n",
       "                        \"C\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"B\",\n",
       "                        \"B\",\n",
       "                        \"A\",\n",
       "                        \"0.0\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"B\",\n",
       "                        \"B\",\n",
       "                        \"B\",\n",
       "                        \"0.5\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"B\",\n",
       "                        \"B\",\n",
       "                        \"C\",\n",
       "                        \"0.5\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"B\",\n",
       "                        \"C\",\n",
       "                        \"A\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"B\",\n",
       "                        \"C\",\n",
       "                        \"B\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"B\",\n",
       "                        \"C\",\n",
       "                        \"C\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"C\",\n",
       "                        \"A\",\n",
       "                        \"A\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"C\",\n",
       "                        \"A\",\n",
       "                        \"B\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"C\",\n",
       "                        \"A\",\n",
       "                        \"C\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"C\",\n",
       "                        \"B\",\n",
       "                        \"A\",\n",
       "                        \"1.0\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"C\",\n",
       "                        \"B\",\n",
       "                        \"B\",\n",
       "                        \"0.0\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"C\",\n",
       "                        \"B\",\n",
       "                        \"C\",\n",
       "                        \"0.0\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"C\",\n",
       "                        \"C\",\n",
       "                        \"A\",\n",
       "                        \"0.25\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"C\",\n",
       "                        \"C\",\n",
       "                        \"B\",\n",
       "                        \"0.0\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"C\",\n",
       "                        \"C\",\n",
       "                        \"C\",\n",
       "                        \"0.75\"\n",
       "                    ]\n",
       "                ],\n",
       "                \"dtypes\" : [\n",
       "                    \"str\",\n",
       "                    \"str\",\n",
       "                    \"str\",\n",
       "                    \"float\"\n",
       "                ],\n",
       "                \"parents\" : [\n",
       "                    {\n",
       "                        \"class\" : \"Distribution\",\n",
       "                        \"name\" : \"ConditionalProbabilityTable\",\n",
       "                        \"table\" : [\n",
       "                            [\n",
       "                                \"True\",\n",
       "                                \"B\",\n",
       "                                \"0.0\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"True\",\n",
       "                                \"C\",\n",
       "                                \"0.7142857142857143\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"True\",\n",
       "                                \"A\",\n",
       "                                \"0.2857142857142857\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"False\",\n",
       "                                \"B\",\n",
       "                                \"0.4\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"False\",\n",
       "                                \"C\",\n",
       "                                \"0.0\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"False\",\n",
       "                                \"A\",\n",
       "                                \"0.6\"\n",
       "                            ]\n",
       "                        ],\n",
       "                        \"dtypes\" : [\n",
       "                            \"bool\",\n",
       "                            \"str\",\n",
       "                            \"float\"\n",
       "                        ],\n",
       "                        \"parents\" : [\n",
       "                            {\n",
       "                                \"class\" : \"Distribution\",\n",
       "                                \"dtype\" : \"bool\",\n",
       "                                \"name\" : \"DiscreteDistribution\",\n",
       "                                \"parameters\" : [\n",
       "                                    {\n",
       "                                        \"True\" : 0.5833333333333334,\n",
       "                                        \"False\" : 0.4166666666666667\n",
       "                                    }\n",
       "                                ],\n",
       "                                \"frozen\" : false\n",
       "                            }\n",
       "                        ]\n",
       "                    },\n",
       "                    {\n",
       "                        \"class\" : \"Distribution\",\n",
       "                        \"name\" : \"ConditionalProbabilityTable\",\n",
       "                        \"table\" : [\n",
       "                            [\n",
       "                                \"False\",\n",
       "                                \"True\",\n",
       "                                \"B\",\n",
       "                                \"0.3333333333333333\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"False\",\n",
       "                                \"True\",\n",
       "                                \"C\",\n",
       "                                \"0.6666666666666666\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"False\",\n",
       "                                \"True\",\n",
       "                                \"A\",\n",
       "                                \"0.0\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"False\",\n",
       "                                \"False\",\n",
       "                                \"B\",\n",
       "                                \"0.4\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"False\",\n",
       "                                \"False\",\n",
       "                                \"C\",\n",
       "                                \"0.0\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"False\",\n",
       "                                \"False\",\n",
       "                                \"A\",\n",
       "                                \"0.6\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"True\",\n",
       "                                \"True\",\n",
       "                                \"B\",\n",
       "                                \"0.0\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"True\",\n",
       "                                \"True\",\n",
       "                                \"C\",\n",
       "                                \"0.5\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"True\",\n",
       "                                \"True\",\n",
       "                                \"A\",\n",
       "                                \"0.5\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"True\",\n",
       "                                \"False\",\n",
       "                                \"B\",\n",
       "                                \"0.3333333333333333\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"True\",\n",
       "                                \"False\",\n",
       "                                \"C\",\n",
       "                                \"0.3333333333333333\"\n",
       "                            ],\n",
       "                            [\n",
       "                                \"True\",\n",
       "                                \"False\",\n",
       "                                \"A\",\n",
       "                                \"0.3333333333333333\"\n",
       "                            ]\n",
       "                        ],\n",
       "                        \"dtypes\" : [\n",
       "                            \"bool\",\n",
       "                            \"bool\",\n",
       "                            \"str\",\n",
       "                            \"float\"\n",
       "                        ],\n",
       "                        \"parents\" : [\n",
       "                            {\n",
       "                                \"class\" : \"Distribution\",\n",
       "                                \"name\" : \"ConditionalProbabilityTable\",\n",
       "                                \"table\" : [\n",
       "                                    [\n",
       "                                        \"0\",\n",
       "                                        \"False\",\n",
       "                                        \"0.6666666666666666\"\n",
       "                                    ],\n",
       "                                    [\n",
       "                                        \"0\",\n",
       "                                        \"True\",\n",
       "                                        \"0.3333333333333333\"\n",
       "                                    ],\n",
       "                                    [\n",
       "                                        \"1\",\n",
       "                                        \"False\",\n",
       "                                        \"0.8\"\n",
       "                                    ],\n",
       "                                    [\n",
       "                                        \"1\",\n",
       "                                        \"True\",\n",
       "                                        \"0.2\"\n",
       "                                    ],\n",
       "                                    [\n",
       "                                        \"2\",\n",
       "                                        \"False\",\n",
       "                                        \"0.5\"\n",
       "                                    ],\n",
       "                                    [\n",
       "                                        \"2\",\n",
       "                                        \"True\",\n",
       "                                        \"0.5\"\n",
       "                                    ]\n",
       "                                ],\n",
       "                                \"dtypes\" : [\n",
       "                                    \"int\",\n",
       "                                    \"bool\",\n",
       "                                    \"float\"\n",
       "                                ],\n",
       "                                \"parents\" : [\n",
       "                                    {\n",
       "                                        \"class\" : \"Distribution\",\n",
       "                                        \"dtype\" : \"int\",\n",
       "                                        \"name\" : \"DiscreteDistribution\",\n",
       "                                        \"parameters\" : [\n",
       "                                            {\n",
       "                                                \"0\" : 0.25,\n",
       "                                                \"1\" : 0.4166666666666667,\n",
       "                                                \"2\" : 0.3333333333333333\n",
       "                                            }\n",
       "                                        ],\n",
       "                                        \"frozen\" : false\n",
       "                                    }\n",
       "                                ]\n",
       "                            },\n",
       "                            {\n",
       "                                \"class\" : \"Distribution\",\n",
       "                                \"dtype\" : \"bool\",\n",
       "                                \"name\" : \"DiscreteDistribution\",\n",
       "                                \"parameters\" : [\n",
       "                                    {\n",
       "                                        \"True\" : 0.5833333333333334,\n",
       "                                        \"False\" : 0.4166666666666667\n",
       "                                    }\n",
       "                                ],\n",
       "                                \"frozen\" : false\n",
       "                            }\n",
       "                        ]\n",
       "                    }\n",
       "                ]\n",
       "            },\n",
       "            \"name\" : \"monty\",\n",
       "            \"weight\" : 1.0\n",
       "        },\n",
       "        {\n",
       "            \"class\" : \"State\",\n",
       "            \"distribution\" : {\n",
       "                \"class\" : \"Distribution\",\n",
       "                \"dtype\" : \"int\",\n",
       "                \"name\" : \"DiscreteDistribution\",\n",
       "                \"parameters\" : [\n",
       "                    {\n",
       "                        \"0\" : 0.25,\n",
       "                        \"1\" : 0.4166666666666667,\n",
       "                        \"2\" : 0.3333333333333333\n",
       "                    }\n",
       "                ],\n",
       "                \"frozen\" : false\n",
       "            },\n",
       "            \"name\" : \"remaining\",\n",
       "            \"weight\" : 1.0\n",
       "        },\n",
       "        {\n",
       "            \"class\" : \"State\",\n",
       "            \"distribution\" : {\n",
       "                \"class\" : \"Distribution\",\n",
       "                \"name\" : \"ConditionalProbabilityTable\",\n",
       "                \"table\" : [\n",
       "                    [\n",
       "                        \"0\",\n",
       "                        \"True\",\n",
       "                        \"0.3333333333333333\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"0\",\n",
       "                        \"False\",\n",
       "                        \"0.6666666666666666\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"1\",\n",
       "                        \"True\",\n",
       "                        \"0.2\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"1\",\n",
       "                        \"False\",\n",
       "                        \"0.8\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"2\",\n",
       "                        \"True\",\n",
       "                        \"0.5\"\n",
       "                    ],\n",
       "                    [\n",
       "                        \"2\",\n",
       "                        \"False\",\n",
       "                        \"0.5\"\n",
       "                    ]\n",
       "                ],\n",
       "                \"dtypes\" : [\n",
       "                    \"int\",\n",
       "                    \"bool\",\n",
       "                    \"float\"\n",
       "                ],\n",
       "                \"parents\" : [\n",
       "                    {\n",
       "                        \"class\" : \"Distribution\",\n",
       "                        \"dtype\" : \"int\",\n",
       "                        \"name\" : \"DiscreteDistribution\",\n",
       "                        \"parameters\" : [\n",
       "                            {\n",
       "                                \"0\" : 0.25,\n",
       "                                \"1\" : 0.4166666666666667,\n",
       "                                \"2\" : 0.3333333333333333\n",
       "                            }\n",
       "                        ],\n",
       "                        \"frozen\" : false\n",
       "                    }\n",
       "                ]\n",
       "            },\n",
       "            \"name\" : \"randomize\",\n",
       "            \"weight\" : 1.0\n",
       "        }\n",
       "    ]\n",
       "}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = [[ True,  'A', 'A', 'C', 1, True  ],\n",
    "\t\t[ True,  'A', 'A', 'C', 0, True  ],\n",
    "\t\t[ False, 'A', 'A', 'B', 1, False ],\n",
    "\t\t[ False, 'A', 'A', 'A', 2, False ],\n",
    "\t\t[ False, 'A', 'A', 'C', 1, False ],\n",
    "\t\t[ False, 'B', 'B', 'B', 2, False ],\n",
    "\t\t[ False, 'B', 'B', 'C', 0, False ],\n",
    "\t\t[ True,  'C', 'C', 'A', 2, True  ],\n",
    "\t\t[ True,  'C', 'C', 'C', 1, False ],\n",
    "\t\t[ True,  'C', 'C', 'C', 0, False ],\n",
    "\t\t[ True,  'C', 'C', 'C', 2, True  ],\n",
    "\t\t[ True,  'C', 'B', 'A', 1, False ]]\n",
    "\n",
    "network.fit( data )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can see the results below. Lets look at the distribution for our Friend first."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "    \"class\" :\"Distribution\",\n",
      "    \"dtype\" :\"bool\",\n",
      "    \"name\" :\"DiscreteDistribution\",\n",
      "    \"parameters\" :[\n",
      "        {\n",
      "            \"True\" :0.5833333333333334,\n",
      "            \"False\" :0.4166666666666667\n",
      "        }\n",
      "    ],\n",
      "    \"frozen\" :false\n",
      "}\n"
     ]
    }
   ],
   "source": [
    "print(friend)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then our Guest."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\tB\t0.0\n",
      "True\tC\t0.7142857142857143\n",
      "True\tA\t0.2857142857142857\n",
      "False\tB\t0.4\n",
      "False\tC\t0.0\n",
      "False\tA\t0.6\n"
     ]
    }
   ],
   "source": [
    "print(guest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now the remaining cars."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "    \"class\" :\"Distribution\",\n",
      "    \"dtype\" :\"int\",\n",
      "    \"name\" :\"DiscreteDistribution\",\n",
      "    \"parameters\" :[\n",
      "        {\n",
      "            \"0\" :0.25,\n",
      "            \"1\" :0.4166666666666667,\n",
      "            \"2\" :0.3333333333333333\n",
      "        }\n",
      "    ],\n",
      "    \"frozen\" :false\n",
      "}\n"
     ]
    }
   ],
   "source": [
    "print(remaining)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And the probability the prize is randomized."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\tFalse\t0.6666666666666666\n",
      "0\tTrue\t0.3333333333333333\n",
      "1\tFalse\t0.8\n",
      "1\tTrue\t0.2\n",
      "2\tFalse\t0.5\n",
      "2\tTrue\t0.5\n"
     ]
    }
   ],
   "source": [
    "print(randomize)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now the distribution of the Prize."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "False\tTrue\tB\t0.3333333333333333\n",
      "False\tTrue\tC\t0.6666666666666666\n",
      "False\tTrue\tA\t0.0\n",
      "False\tFalse\tB\t0.4\n",
      "False\tFalse\tC\t0.0\n",
      "False\tFalse\tA\t0.6\n",
      "True\tTrue\tB\t0.0\n",
      "True\tTrue\tC\t0.5\n",
      "True\tTrue\tA\t0.5\n",
      "True\tFalse\tB\t0.3333333333333333\n",
      "True\tFalse\tC\t0.3333333333333333\n",
      "True\tFalse\tA\t0.3333333333333333\n"
     ]
    }
   ],
   "source": [
    "print(prize)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And finally our Monty."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "B\tB\tB\t0.5\n",
      "B\tB\tC\t0.5\n",
      "B\tB\tA\t0.0\n",
      "B\tC\tB\t0.3333333333333333\n",
      "B\tC\tC\t0.3333333333333333\n",
      "B\tC\tA\t0.3333333333333333\n",
      "B\tA\tB\t0.3333333333333333\n",
      "B\tA\tC\t0.3333333333333333\n",
      "B\tA\tA\t0.3333333333333333\n",
      "C\tB\tB\t0.0\n",
      "C\tB\tC\t0.0\n",
      "C\tB\tA\t1.0\n",
      "C\tC\tB\t0.0\n",
      "C\tC\tC\t0.75\n",
      "C\tC\tA\t0.25\n",
      "C\tA\tB\t0.3333333333333333\n",
      "C\tA\tC\t0.3333333333333333\n",
      "C\tA\tA\t0.3333333333333333\n",
      "A\tB\tB\t0.3333333333333333\n",
      "A\tB\tC\t0.3333333333333333\n",
      "A\tB\tA\t0.3333333333333333\n",
      "A\tC\tB\t0.3333333333333333\n",
      "A\tC\tC\t0.3333333333333333\n",
      "A\tC\tA\t0.3333333333333333\n",
      "A\tA\tB\t0.2\n",
      "A\tA\tC\t0.6\n",
      "A\tA\tA\t0.2\n"
     ]
    }
   ],
   "source": [
    "print(monty)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
